#include "sort_csv_by_time.h"

extern std::string output_csv_filename;
extern int time_column;
extern std::string sorted_csv_filename;

void sort_csv_by_time(){
    sorted_csv_filename="sorted_"+output_csv_filename;
    std::ifstream sort_source_file(output_csv_filename);
    std::ofstream sort_target_file(sorted_csv_filename);
	if(sort_target_file.is_open()){
        std::vector<std::vector<std::string>> csv_vector;
		std::string line_cur;
		std::string table_head;
		getline(sort_source_file, table_head);
		while(getline(sort_source_file, line_cur)){
            std::vector<std::string> cur_line_vector;
			split_by_char(line_cur, cur_line_vector, ',');
			csv_vector.push_back(cur_line_vector);
		}
		/* 排序、写到文件 */
		sort(csv_vector.begin(), csv_vector.end(), sort_by_time);
        sort_target_file<<table_head<<std::endl;
		for(auto it:csv_vector){
			sort_target_file<<it[0];
			for(int i=1; i<it.size(); i++){
				sort_target_file<<","<<it[i];
			}
            sort_target_file<<std::endl;
		}
	}
	else{
        std::cout<<"\033[031m"<<"Error opening sort target file."<<"\033[0m"<<std::endl;
		/* ，后续绘图的时候要特殊 */
		/**
		 * todo: 
		 * 这里直接返回并没有新的文件生成
		 * 可以：
		 * 	方案1：后续绘制曲线图的时候处理一下，没有`sort_`开头的文件，就去找排序的文件
		 * 	方案2：直接抛出异常，终止程序
		 */
		return;
	}
}

bool sort_by_time(std::vector<string>& line1_vals, std::vector<string>& line2_vals){
	/** 
	 * 当前记录中包含1月&12月特殊处理，1月大于12月
	 * 剩余情况正常排序
	 * return true：表示递增时line1、line2顺序不变
	 * return false：表示递增排序需要更换line1、line2顺序
	 * sort函数默认是从小到大
	 */
	/* 依赖于时间格式：MM-dd hh:mm:ss */
	std::string time_str1=line1_vals[time_column-1];
	std::string time_str2=line2_vals[time_column-1];

	std::string date1=time_str1.substr(0,5);
	std::string date2=time_str2.substr(0,5);

	bool Jan_exist=false;
	bool Dec_exist=false;

	if(date1.substr(0, 2)=="01" || date2.substr(0, 2)=="01"){
		Jan_exist=true;
	}
	if(date1.substr(0, 2)=="12" || date2.substr(0, 2)=="12"){
		Dec_exist=true;
	}

	/* 同时存在1月&12月的记录，此时做特殊处理 */
	if(Jan_exist && Dec_exist){
		return (date1.substr(0, 2)=="12")?true:false;
	}
	/* 没有存在1月&12月的记录，直接比较时间字符串即可 */
	return time_str1 < time_str2;
}
